package showgo.gui;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JDialog;
import javax.swing.JOptionPane;

import showgo.modell.Manager;
import showgo.modell.stueck.Absatz;
import showgo.modell.stueck.Akt;
import showgo.modell.stueck.Rede;
import showgo.modell.stueck.Regieanweisung;
import showgo.modell.stueck.Stueck;
import showgo.modell.stueck.Szene;
import showgo.modell.stueck.Text;

/**
 * GUI zur Verwaltung eines Theaterstueckes;
 * 
 * @author lutz
 * 
 */
public class StueckDialog extends JDialog implements ActionListener,
	KeyListener, MouseListener, ItemListener, MouseMotionListener,
	IMyListener {

    /**
     * 
     */
    private static final long serialVersionUID = 3711994441239077956L;

    @SuppressWarnings("rawtypes")
    private javax.swing.JComboBox aktComboBox;
    private javax.swing.JButton entferneAktButton;
    private javax.swing.JLabel aktLabel;
    private javax.swing.JButton abbrechenButton;
    private javax.swing.JButton beendenButton;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JLabel stueckTitelLabel;
    private javax.swing.JTextField stueckTitelTextField;
    @SuppressWarnings("rawtypes")
    private javax.swing.JComboBox szeneComboBox;
    private javax.swing.JButton entferneSzeneButton;
    private javax.swing.JLabel szeneLabel;
    private StueckTable jTable1;
    private javax.swing.JButton rollenButton;
    private javax.swing.JButton neuerTextButton;

    private Stueck uebergebenesStueck = null;
    private Stueck neuesStueck = null;

    public StueckDialog(Stueck uebergebenesStueck) {
	this.uebergebenesStueck = uebergebenesStueck;
	this.neuesStueck = uebergebenesStueck.tiefeKopie();
	initComponents();
	Manager.getInstance().addListener(this);
    }

    @SuppressWarnings({ "rawtypes" })
    private void initComponents() {

	stueckTitelLabel = new javax.swing.JLabel();

	stueckTitelTextField = new javax.swing.JTextField();
	stueckTitelTextField.setText(uebergebenesStueck.getName());

	aktLabel = new javax.swing.JLabel();
	szeneLabel = new javax.swing.JLabel();
	jLabel1 = new javax.swing.JLabel();
	jScrollPane1 = new javax.swing.JScrollPane();

	jTable1 = new StueckTable();
	jTable1.addMouseListener(this);
	jTable1.addKeyListener(this);
	jTable1.setSelectionMode(1);
	jTable1.addMouseMotionListener(new MouseMotionAdapter() {
	    public void mouseDragged(MouseEvent evt) {

	    }
	});

	neuerTextButton = new javax.swing.JButton();
	neuerTextButton.setFont(new java.awt.Font("Tahoma", 1, 12));
	neuerTextButton.setText("Text Hinzufügen");
	neuerTextButton.addActionListener(this);

	setTitle("Stück bearbeiten:");
	setPreferredSize(new java.awt.Dimension(1000, 500));
	setResizable(false);

	stueckTitelLabel.setFont(new java.awt.Font("Tahoma", 1, 14));
	stueckTitelLabel.setText("Titel des Stückes");

	aktLabel.setFont(new java.awt.Font("Tahoma", 1, 14));
	aktLabel.setText("Akt/ Aufzug");

	aktComboBox = new javax.swing.JComboBox();
	aktComboBox.addItemListener(this);
	aktComboBox.setEditable(false);

	szeneComboBox = new javax.swing.JComboBox();
	szeneComboBox.addItemListener(this);
	szeneComboBox.setEditable(false);
	initAktComboBox();

	entferneAktButton = new javax.swing.JButton();
	entferneAktButton.setFont(new java.awt.Font("Tahoma", 1, 11));
	entferneAktButton.setText("Akt entfernen");
	entferneAktButton.addActionListener(this);

	szeneLabel.setFont(new java.awt.Font("Tahoma", 1, 14));
	szeneLabel.setText("Szene");

	beendenButton = new javax.swing.JButton();
	beendenButton.setFont(new java.awt.Font("Tahoma", 1, 12));
	beendenButton.setText("Beenden");
	beendenButton.addActionListener(this);

	entferneSzeneButton = new javax.swing.JButton();
	entferneSzeneButton.setFont(new java.awt.Font("Tahoma", 1, 11));
	entferneSzeneButton.setText("Szene entfernen");
	entferneSzeneButton.addActionListener(this);

	abbrechenButton = new javax.swing.JButton();
	abbrechenButton.setFont(new java.awt.Font("Tahoma", 1, 12));
	abbrechenButton.setText("Abbrechen");
	abbrechenButton.addActionListener(this);

	rollenButton = new javax.swing.JButton();
	rollenButton.setFont(new java.awt.Font("Tahoma", 1, 12));
	rollenButton.setText("Rollen anzeigen");
	rollenButton.addActionListener(this);

	jLabel1.setFont(new java.awt.Font("Tahoma", 1, 16));
	jLabel1.setText("Bearbeiten von einzelnen Stücken");

	jScrollPane1.setViewportView(jTable1);

	javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
		getContentPane());
	getContentPane().setLayout(layout);
	layout.setHorizontalGroup(layout
		.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
		.addGroup(
			layout.createSequentialGroup()
				.addContainerGap()
				.addGroup(
					layout.createParallelGroup(
						javax.swing.GroupLayout.Alignment.LEADING)
						.addGroup(
							layout.createSequentialGroup()
								.addComponent(
									jScrollPane1,
									javax.swing.GroupLayout.DEFAULT_SIZE,
									813,
									Short.MAX_VALUE)
								.addGap(18, 18,
									18)
								.addGroup(
									layout.createParallelGroup(
										javax.swing.GroupLayout.Alignment.LEADING)
										.addGroup(
											layout.createParallelGroup(
												javax.swing.GroupLayout.Alignment.LEADING)
												.addComponent(
													beendenButton,
													javax.swing.GroupLayout.Alignment.TRAILING,
													javax.swing.GroupLayout.PREFERRED_SIZE,
													150,
													javax.swing.GroupLayout.PREFERRED_SIZE)
												.addComponent(
													abbrechenButton,
													javax.swing.GroupLayout.Alignment.TRAILING,
													javax.swing.GroupLayout.PREFERRED_SIZE,
													150,
													javax.swing.GroupLayout.PREFERRED_SIZE))
										.addComponent(
											rollenButton,
											javax.swing.GroupLayout.Alignment.TRAILING,
											javax.swing.GroupLayout.PREFERRED_SIZE,
											150,
											javax.swing.GroupLayout.PREFERRED_SIZE)
										.addComponent(
											neuerTextButton,
											javax.swing.GroupLayout.PREFERRED_SIZE,
											150,
											javax.swing.GroupLayout.PREFERRED_SIZE)))
						.addGroup(
							layout.createSequentialGroup()
								.addGroup(
									layout.createParallelGroup(
										javax.swing.GroupLayout.Alignment.LEADING)
										.addGroup(
											layout.createSequentialGroup()
												.addGroup(
													layout.createParallelGroup(
														javax.swing.GroupLayout.Alignment.LEADING)
														.addGroup(
															layout.createSequentialGroup()
																.addComponent(
																	stueckTitelLabel)
																.addGap(76,
																	76,
																	76)
																.addComponent(
																	aktLabel))
														.addGroup(
															layout.createSequentialGroup()
																.addComponent(
																	stueckTitelTextField,
																	javax.swing.GroupLayout.PREFERRED_SIZE,
																	170,
																	javax.swing.GroupLayout.PREFERRED_SIZE)
																.addGap(18,
																	18,
																	18)
																.addGroup(
																	layout.createParallelGroup(
																		javax.swing.GroupLayout.Alignment.LEADING,
																		false)
																		.addComponent(
																			entferneAktButton,
																			javax.swing.GroupLayout.DEFAULT_SIZE,
																			javax.swing.GroupLayout.DEFAULT_SIZE,
																			Short.MAX_VALUE)
																		.addComponent(
																			aktComboBox,
																			0,
																			javax.swing.GroupLayout.DEFAULT_SIZE,
																			Short.MAX_VALUE))))
												.addGap(18,
													18,
													18)
												.addGroup(
													layout.createParallelGroup(
														javax.swing.GroupLayout.Alignment.LEADING,
														false)
														.addComponent(
															entferneSzeneButton,
															javax.swing.GroupLayout.DEFAULT_SIZE,
															javax.swing.GroupLayout.DEFAULT_SIZE,
															Short.MAX_VALUE)
														.addComponent(
															szeneLabel)
														.addComponent(
															szeneComboBox,
															0,
															javax.swing.GroupLayout.DEFAULT_SIZE,
															Short.MAX_VALUE)))
										.addComponent(
											jLabel1))
								.addGap(0,
									0,
									Short.MAX_VALUE)))
				.addContainerGap()));
	layout.setVerticalGroup(layout
		.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
		.addGroup(
			layout.createSequentialGroup()
				.addContainerGap()
				.addComponent(jLabel1)
				.addGap(18, 18, 18)
				.addGroup(
					layout.createParallelGroup(
						javax.swing.GroupLayout.Alignment.BASELINE)
						.addComponent(stueckTitelLabel)
						.addComponent(aktLabel)
						.addComponent(szeneLabel))
				.addPreferredGap(
					javax.swing.LayoutStyle.ComponentPlacement.RELATED)
				.addGroup(
					layout.createParallelGroup(
						javax.swing.GroupLayout.Alignment.BASELINE)
						.addComponent(
							stueckTitelTextField,
							javax.swing.GroupLayout.PREFERRED_SIZE,
							javax.swing.GroupLayout.DEFAULT_SIZE,
							javax.swing.GroupLayout.PREFERRED_SIZE)
						.addComponent(
							aktComboBox,
							javax.swing.GroupLayout.PREFERRED_SIZE,
							javax.swing.GroupLayout.DEFAULT_SIZE,
							javax.swing.GroupLayout.PREFERRED_SIZE)
						.addComponent(
							szeneComboBox,
							javax.swing.GroupLayout.PREFERRED_SIZE,
							javax.swing.GroupLayout.DEFAULT_SIZE,
							javax.swing.GroupLayout.PREFERRED_SIZE))
				.addPreferredGap(
					javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
				.addGroup(
					layout.createParallelGroup(
						javax.swing.GroupLayout.Alignment.BASELINE)
						.addComponent(entferneAktButton)
						.addComponent(
							entferneSzeneButton))
				.addGap(18, 18, 18)
				.addGroup(
					layout.createParallelGroup(
						javax.swing.GroupLayout.Alignment.LEADING)
						.addGroup(
							layout.createSequentialGroup()
								.addGap(0,
									0,
									Short.MAX_VALUE)
								.addComponent(
									neuerTextButton,
									javax.swing.GroupLayout.PREFERRED_SIZE,
									50,
									javax.swing.GroupLayout.PREFERRED_SIZE)
								.addPreferredGap(
									javax.swing.LayoutStyle.ComponentPlacement.RELATED)
								.addComponent(
									rollenButton,
									javax.swing.GroupLayout.PREFERRED_SIZE,
									50,
									javax.swing.GroupLayout.PREFERRED_SIZE)
								.addGap(18, 18,
									18)
								.addComponent(
									abbrechenButton,
									javax.swing.GroupLayout.PREFERRED_SIZE,
									50,
									javax.swing.GroupLayout.PREFERRED_SIZE)
								.addPreferredGap(
									javax.swing.LayoutStyle.ComponentPlacement.RELATED)
								.addComponent(
									beendenButton,
									javax.swing.GroupLayout.PREFERRED_SIZE,
									50,
									javax.swing.GroupLayout.PREFERRED_SIZE))
						.addComponent(
							jScrollPane1,
							javax.swing.GroupLayout.DEFAULT_SIZE,
							346, Short.MAX_VALUE))
				.addContainerGap()));

	pack();
    }

    @SuppressWarnings({ "rawtypes", "unchecked" })
    private void initAktComboBox() {
	if (!neuesStueck.getAkte().isEmpty()) {
	    String[] aktIDs = new String[neuesStueck.getAkte().size()];
	    for (int i = 0; i < neuesStueck.getAkte().size(); i++) {
		aktIDs[i] = neuesStueck.getAkte().get(i).getAktID();
	    }
	    aktComboBox.setModel(new javax.swing.DefaultComboBoxModel(aktIDs));
	    initSzenenComboBox();
	}
    }

    @SuppressWarnings({ "rawtypes", "unchecked" })
    private void initSzenenComboBox() {
	Akt aktuellerAkt = neuesStueck.getAkte().get(0);
	if (aktComboBox.getSelectedIndex() > -1) {
	    aktuellerAkt = neuesStueck.getAkte().get(
		    aktComboBox.getSelectedIndex());

	}
	String[] szenenIDs = new String[aktuellerAkt.getSzenen().size()];
	for (int i = 0; i < aktuellerAkt.getSzenen().size(); i++) {
	    szenenIDs[i] = aktuellerAkt.getSzenen().get(i).getSzenenID();
	}
	szeneComboBox.setModel(new javax.swing.DefaultComboBoxModel(szenenIDs));
	initTable();
    }

    @SuppressWarnings("static-access")
    private void initTable() {
	jTable1.setModel(new StueckTableModel());
	jTable1.getColumn("Regie/Rolle").setPreferredWidth(100);
	jTable1.getColumn("Text").setPreferredWidth(710);
	jTable1.setAutoResizeMode(jTable1.AUTO_RESIZE_OFF);

	Akt aktuellerAkt = neuesStueck.getAkte().get(
		aktComboBox.getSelectedIndex());

	Szene aktuelleSzene = aktuellerAkt.getSzenen().get(
		szeneComboBox.getSelectedIndex());
	for (int i = 0; i < aktuelleSzene.getAbsaetze().size(); i++) {
	    jTable1.addAbsatz(aktuelleSzene.getAbsaetze().get(i));
	}
    }

    @Override
    public void itemStateChanged(ItemEvent e) {
	if (e.getSource() == aktComboBox) {
	    initSzenenComboBox();
	} else if (e.getSource() == szeneComboBox) {
	    initTable();
	}
    }

    @Override
    public void mouseClicked(MouseEvent arg0) {

    }

    @Override
    public void mouseEntered(MouseEvent arg0) {

    }

    @Override
    public void mouseExited(MouseEvent arg0) {

    }

    @Override
    public void mousePressed(MouseEvent arg0) {

    }

    @Override
    public void mouseReleased(MouseEvent arg0) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
	if (e.getSource() == jTable1) {
	    if (e.getKeyCode() == KeyEvent.VK_DELETE
		    && jTable1.getSelectedRow() > -1) {
		entferneAbsatz();
	    }
	}
    }

    private void entferneAbsatz() {
	int ret = JOptionPane.showConfirmDialog(null,
		"Wollen Sie die Passage wirklich entfernen?", "Hinweis!",
		JOptionPane.YES_NO_OPTION);
	if (ret == JOptionPane.YES_OPTION) {
	    neuesStueck.getAkte().get(aktComboBox.getSelectedIndex())
		    .getSzenen().get(szeneComboBox.getSelectedIndex())
		    .getAbsaetze().remove(jTable1.getSelectedRow());
	    initTable();
	    aktuallisiereRollen();
	}
    }

    @Override
    public void keyReleased(KeyEvent arg0) {

    }

    @Override
    public void keyTyped(KeyEvent arg0) {

    }

    @Override
    public void actionPerformed(ActionEvent e) {
	if (e.getSource() == beendenButton) {
	    // erst Test, ob Eingaben vollstaendig sind;
	    if (titelIstEingegeben() && tabelleIstVollstaendig()) {
		String titel = stueckTitelTextField.getText();
		aenderungAusTabelleUebernehmen();
		// den eingegebenen Titel uebernehmen;
		neuesStueck.setName(titel);

		int ret = JOptionPane.showConfirmDialog(null,
			"Wollen Sie das Stück so übernehmen?", "Hinweis!",
			JOptionPane.YES_NO_OPTION);
		if (ret == JOptionPane.YES_OPTION) {
		    Manager.getInstance().entferneStueck(
			    uebergebenesStueck.getName());
		    Manager.getInstance().fuegeStueckHinzu(neuesStueck);
		}
		Manager.getInstance().fireListChanged();
		dispose();
	    }
	} else if (e.getSource() == entferneAktButton) {
	    entferneAkt();

	} else if (e.getSource() == entferneSzeneButton) {
	    entferneSzene();
	} else if (e.getSource() == abbrechenButton) {
	    dispose();
	} else if (e.getSource() == rollenButton) {
	    // oeffnet Rollendialog zum bearbeiten der Rollen im Stueck;
	    final RollenDialog rollenDialog = new RollenDialog(neuesStueck);
	    rollenDialog.setModal(true);
	    rollenDialog.setLocationRelativeTo(null);
	    rollenDialog.setVisible(true);
	} else if (e.getSource() == neuerTextButton) {
	    fuegeTextEin();

	}
    }

    /**
     * Entfernen der Szene, die in der Combobox angezeigt wird;
     */
    private void entferneSzene() {
	if (szeneComboBox.getSelectedIndex() > -1) {
	    int ret = JOptionPane.showConfirmDialog(null,
		    "Wollen Sie diese Szene wirklich entfernen?",
		    "Szene entfernen!", JOptionPane.YES_NO_OPTION);
	    if (ret == JOptionPane.YES_OPTION) {
		// die Szene entfernen:
		neuesStueck.getAkte().get(aktComboBox.getSelectedIndex())
			.getSzenen().remove(szeneComboBox.getSelectedIndex());
		// Rollen aktuallisieren, da nach dem Entfernen einer Szene
		aktuallisiereRollen();

		// nach Entfernen der Szene aus dem Akt, wird nun geprueft, ob
		// der Akt noch Szenen hat;
		if (!neuesStueck.getAkte().get(aktComboBox.getSelectedIndex())
			.getSzenen().isEmpty()) {
		    initSzenenComboBox();
		} else {
		    entferneAkt();
		}
		neuesStueck.refreshRollen();
	    }
	}
    }

    /**
     * Diese Methode prueft, ob nach dem Entfernen einer Szene oder einem Akt
     * Rollen entfernt werden koennen;
     */
    private void aktuallisiereRollen() {
	// fuer jede Rolle im Stueck prufen, ob sie
	// noch vorhanden ist:
	for (int i = 0; i < neuesStueck.getRollen().size(); i++) {
	    if (!Manager.getInstance().rolleIstNochVorhanden(
		    neuesStueck.getRollen().get(i), neuesStueck)) {
		// Rolle ist nicht mehr im Stueck vorhanden,
		// also kann sie entfern werden:
		int ret = JOptionPane.showConfirmDialog(null,
			"Wollen Sie die nicht mehr vorhandene Rolle "
				+ neuesStueck.getRollen().get(i)
					.getRollenName() + " entfernen?",
			"Rolle entfernen!", JOptionPane.YES_NO_OPTION);
		if (ret == JOptionPane.YES_OPTION) {
		    neuesStueck.getRollen().remove(
			    neuesStueck.getRollen().get(i));
		}
		// Besetzungen auch gleich aktualisieren:
		if (!Manager.getInstance().getInszenierungen().isEmpty()) {
		    Manager.getInstance().aktualisiereInszenierung();
		}
		i = 0;
	    }
	}
    }

    /**
     * Entfernt den Akt, der in der Combobox angezeigt wird;
     */
    private void entferneAkt() {
	// Test, ob ein Akt angezeigt wird:
	if (aktComboBox.getSelectedItem() != null) {
	    int ret = JOptionPane.showConfirmDialog(null,
		    "Wollen Sie diesen Akt wirklich entfernen?",
		    "Akt entfernen!", JOptionPane.YES_NO_OPTION);
	    if (ret == JOptionPane.YES_OPTION) {
		neuesStueck.getAkte().remove(aktComboBox.getSelectedIndex());
		// nach jedem Entfernen eines Aktes testen, ob noch Akte
		// im Theaterstueck vorhanden sind;
		if (!neuesStueck.getAkte().isEmpty()) {
		    initAktComboBox();
		    neuesStueck.refreshRollen();
		} else {
		    // das aktuelle Stueck entfernen und den Dialog schliessen;
		    JOptionPane
			    .showMessageDialog(
				    null,
				    "Alle Akte wurden entfernt. Das Theaterstueck wird\ngeloescht und der Dialog geschlossen.",
				    "Akt entfernen!", JOptionPane.YES_NO_OPTION);
		    Manager.getInstance().entferneStueck(
			    uebergebenesStueck.getName());
		    dispose();
		}
	    }
	}
    }

    /**
     * Diese Methode fuegt einen Text am Ende der in der Tabelle dargestellten
     * Szene ein, oder an der ausgewaehlten Stelle.
     */
    private void fuegeTextEin() {
	// erst schauen, wo der neue Text eingefuegt werden soll;
	boolean ende = true;
	if (jTable1.getSelectedRow() > -1) {
	    ende = false;
	}
	int ret = JOptionPane.showConfirmDialog(null,
		"Soll der neue Absatz eine Regieanweisung sein?",
		"Neuer Absatz", JOptionPane.YES_NO_CANCEL_OPTION);
	if (ret == JOptionPane.YES_OPTION) {
	    Regieanweisung regie = new Regieanweisung("Regieanweisung", "");
	    if (ende) {
		// Einfuegen am Ende;
		neuesStueck.getAkte().get(aktComboBox.getSelectedIndex())
			.getSzenen().get(szeneComboBox.getSelectedIndex())
			.getAbsaetze().add(regie);
	    } else {
		// Einfuegen an gewaehlter Stelle;
		neuesStueck.getAkte().get(aktComboBox.getSelectedIndex())
			.getSzenen().get(szeneComboBox.getSelectedIndex())
			.getAbsaetze().add(jTable1.getSelectedRow() + 1, regie);
	    }
	} else if (ret == JOptionPane.NO_OPTION) {
	    Rede rede = new Rede("Redepassage", "\"Rolle\"", new Text(""));
	    if (ende) {
		// Einfuegen am Ende;
		neuesStueck.getAkte().get(aktComboBox.getSelectedIndex())
			.getSzenen().get(szeneComboBox.getSelectedIndex())
			.getAbsaetze().add(rede);
	    } else {
		// Einfuegen an gewaehlter Stelle;
		neuesStueck.getAkte().get(aktComboBox.getSelectedIndex())
			.getSzenen().get(szeneComboBox.getSelectedIndex())
			.getAbsaetze().add(jTable1.getSelectedRow() + 1, rede);
	    }

	}
	initTable();
    }

    /**
     * Test auf leere Zellen in Tabelle
     */
    private boolean tabelleIstVollstaendig() {
	aenderungAusTabelleUebernehmen();
	for (Absatz a : neuesStueck.getAkte()
		.get(aktComboBox.getSelectedIndex()).getSzenen()
		.get(szeneComboBox.getSelectedIndex()).getAbsaetze()) {
	    if (a.getAbsatzID().equals("Regieanweisung")) {
		Regieanweisung regie = (Regieanweisung) a;
		if (regie.getAnweisung().isEmpty()) {
		    JOptionPane
			    .showMessageDialog(
				    null,
				    "Bitte fuellen Sie alle leeren Zellen aus\noder entfernen Sie die Absaetze mit leeren Zellen!");
		    return false;
		}
	    } else if (a.getAbsatzID().equals("Redepassage")) {
		Rede rede = (Rede) a;
		if (rede.getRollenName().isEmpty()
			|| rede.getText().getText().isEmpty()) {
		    JOptionPane
			    .showMessageDialog(
				    null,
				    "Bitte fuellen Sie alle leeren Zellen aus\noder entfernen Sie die Absaetze mit leeren Zellen!");
		    return false;
		}
	    } else if (a.getAbsatzID().isEmpty()) {
		JOptionPane
			.showMessageDialog(
				null,
				"Bitte fuellen Sie alle leeren Zellen aus\noder entfernen Sie die Absaetze mit leeren Zellen!");
		return false;
	    }
	}
	return true;
    }

    /**
     * Pruefung auf eingegebenen Titel;
     */
    private boolean titelIstEingegeben() {
	if (stueckTitelTextField.getText().isEmpty()) {
	    JOptionPane.showMessageDialog(null, "Bitte Titel eingeben!");
	    return false;
	} else if (!stueckTitelTextField.getText().contains("-")
		|| !stueckTitelTextField.getText().contains("Kopie")) {
	    JOptionPane
		    .showMessageDialog(null,
			    "Der Titel muss entweder ein \"-\" \noder den Begriff \"Kopie\" enthalten!");
	    return false;
	}

	else {
	    return true;
	}
    }

    /**
     * Diese Methode uebernimmt alle Aenderungen, die in der Tabelle vorgenommen
     * wurden;
     */
    private void aenderungAusTabelleUebernehmen() {
	List<Absatz> absaetze = new ArrayList<Absatz>();

	for (int i = 0; i < jTable1.getRowCount(); i++) {
	    // aus jeder Reihe ein Absatz-Objekt erzeugen
	    if (jTable1.getValueAt(i, 0).toString().equals("Regieanweisung")) {
		Regieanweisung regie = new Regieanweisung("Regieanweisung",
			jTable1.getValueAt(i, 1).toString());
		absaetze.add(regie);
	    } else if (jTable1.getValueAt(i, 0).toString().equals("")
		    || jTable1.getValueAt(i, 0).toString().length() < 1) {
		// nichts machen
	    } else {
		Rede rede = new Rede("Redepassage", jTable1.getValueAt(i, 0)
			.toString(), new Text(jTable1.getValueAt(i, 1)
			.toString()));
		absaetze.add(rede);
	    }
	}
	neuesStueck.getAkte().get(aktComboBox.getSelectedIndex()).getSzenen()
		.get(szeneComboBox.getSelectedIndex()).setAbsaetze(absaetze);
    }

    @Override
    public void mouseDragged(MouseEvent arg0) {

    }

    @Override
    public void mouseMoved(MouseEvent arg0) {

    }

    @Override
    public void listChanged() {
	initAktComboBox();
    }

}
